package com.yuw.tcpnetwork;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerThread extends Thread {
    @Override
    public void run() {
        try {
            // 创建一个服务器套接字的对象
            // serversocket的端口号指定之后，需要客户端与之保持一致
            ServerSocket serverSocket = new ServerSocket(9090);

            // 创建字符流的对象
            BufferedReader br = null;
            BufferedWriter bw = null;

            // 每次接受客户端的请求，需要使用accept方法创建一个用于接受客户端请求的socket对象
            // 服务器需要一直保持运行状态，所以使用死循环来完成
            while (true) {
                // 接收客户端发送的请求
                Socket socket = serverSocket.accept();

                ///////////////////////////////////服务器接收客户端信息///////////////////////////////////
                // 读取服务器的socket对象的输入流，可接收到客户端的发送信息
                // 输入流对象
                br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 从socket中的输入流中读取客户端发送的信息
                // 如果是多行的需要使用循环读取
                // 默认值为null
                String str = null;
                do {
                    str = br.readLine();
                    // 将读取的字符串内容输出
                    System.out.println("服务器：我是服务器，我接受到客户端的信息了：" + str);
                } while (str != null && !str.equals("0over0")); // 0over0 通信结束符
                //////////////////////////////////////////////////////////////////////////////////////

                ////////////////////////////////////服务器发送消息给客户端//////////////////////////////
                // 向客户端发送信息【使用socked的输出流发送信息】
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
                // 发送给客户端的信息
                bw.write("服务器：Hello,你好客户端，我是服务器，我收到了你的消息");
                System.out.println("服务器：Hello,你好客户端，我是服务器，我收到了你的消息");
                bw.newLine(); // 添加行结束符，否则信息会在缓存中，等待输入结束才发送；  行结束符就是发送的标志
                // 根据通信的习惯，通信双发规定一个结束的符号
                // 通信结束了
                bw.write("0over0");
                bw.newLine();
                bw.flush(); // 清空缓存区，进行发送
                ///////////////////////////////////////////////////////////////////////////////////////

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
